package com.cskaoyan.javase.oop3._1interface._4example.dao.impl;

import com.cskaoyan.javase.oop3._1interface._4example.dao.GoodsDao;
import com.cskaoyan.javase.oop3._1interface._4example.model.Goods;
import com.cskaoyan.javase.oop3._1interface._4example.model.GoodsData;

import java.util.ResourceBundle;

/**
 * 该对象对外提供商品数据处理操作
 *
 * @since 11:13
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class GoodsDaoImpl implements GoodsDao {

    // 该层直接和数据源交互
    private Goods[] srcGoodsArr = GoodsData.GOODS;

    /**
     * 将仅装有商品对象的数组返回
     * @return com.cskaoyan.javase.oop3._1interface._4example.model.Goods[]
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/10/08 11:21
     */
    @Override
    public Goods[] getAllRealGoods() {
        // 过滤掉数据源数组中的null元素,通过数组元素的拷贝删除数组中的null元素
        // 1.统计null元素的个数,然后创建新数组
        int count = 0;
        for (Goods goods : srcGoodsArr) {
            if (goods == null) {
                count++;
            }
        }
        Goods[] result = new Goods[srcGoodsArr.length - count];
        // 2.遍历老数组,过滤null元素,给新数组赋值
        int newIndex = 0;
        for (Goods goods : srcGoodsArr) {
            if (goods == null) {
                continue;
            }
            result[newIndex] = goods;
            newIndex++;
        }
        return result;
    }

    /**
     * 规定id重复返回true,否则返回false
     * @param idInsert 被校验重复性的id
     * @return boolean
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/10/08 11:39
     */
    @Override
    public boolean judgeIdRepeat(int idInsert) {
        // 遍历数组,查找id是否已经重复
        // 为了避免做判空校验,可以选择使用getAllRealGoods方法的返回值数组作为校验id重复性的数组
        for (Goods realGoods : getAllRealGoods()) {
            if (realGoods.getId() == idInsert) {
                // 重复了
                return true;
            }
        }
        return false;
    }

    /**
     * 在id已经不重复的前提下,规定插入成功返回true,不成功返回false
     * @param goodsInsert 被尝试插入数据源数组的商品对象
     * @return boolean
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/10/08 11:44
     */
    @Override
    public boolean insertGoods(Goods goodsInsert) {
        // 普通for遍历数据源数组,找到null位置,进行赋值,即表示插入成功
        for (int i = 0; i < srcGoodsArr.length; i++) {
            if (srcGoodsArr[i] == null) {
                // 找到null的位置,插入成功
                srcGoodsArr[i] = goodsInsert;
                return true;
            }
        }
        // 数组满了,没有null元素的位置了
        return false;
    }
}
